package com.xinyue.design.composite;

/**
 * 组合模式
 * 将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的调用具有统一性。
 * 组合模式的目的是：让客户端不再区分操作的是组合对象还是叶子对象，而是以一个统一的方式来操作。
 * 如果你希望统一的使用组合结构中的所有对象，可以选用组合模式，这正是组合模式提供的主要功能
 * 
 * 对象树
 * 通常，组合模式会组合出树形结构来，组成这个树形结构所使用的多个组件对象，就自然的形成了对象树。
 * 这也意味着凡是可以使用对象树来描述或操作的功能，都可以考虑使用组合模式，比如读取XML文件，或是对语句进行语法解析等。
 */
public abstract class Component {

	/**试穿
	 * 子组件对象有的功能方法
	 * 通常在里面需要实现递归的调用
	 */
	public abstract void tryOn();
	
	/**添加组件
	 * 默认的实现，抛出异常，因为叶子对象没有这个功能，或者子组件没有实现这个功能
	 * @param child
	 */
	public void addChild(Component child) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
	
	/**移除组件
	 * 默认的实现，抛出异常，因为叶子对象没有这个功能，或者子组件没有实现这个功能
	 * @param child
	 */
	public void removeChild(Component child) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
	
	/**根据索引获得组件
	 * 默认的实现，抛出异常，因为叶子对象没有这个功能，或者子组件没有实现这个功能
	 * @param index
	 * @return
	 */
	public Component getChildren(int index) {
		throw new UnsupportedOperationException("对象不支持此功能");
	}
}
